package com.atguigu.rabbitmq.eight;

import com.atguigu.rabbitmq.util.RabbitMqUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.util.HashMap;
import java.util.Map;

/**
 * 死信队列实战
 */
public class Consumer01 {

    // 普通交换机
     public static final String NORMOL_EXCHANGE = "normal_exchange";

     // 死新交换机的名称
    public static final String DEAD_EXCHANGE = "dead_exchange";

    // 普通队列的名称
    public static final String NORMOL_QUEUE =  "normal_queue";

    // 死信队列的名称
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception {


        Channel channel = RabbitMqUtils.getChannel();

        // 申明死信和普通交换机 类型未direct
        channel.exchangeDeclare(NORMOL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        // 声明死信和普通队列

        // 正常队列绑定死信交换机
        Map arguments =  new HashMap();
        // 过期时间 和 长度 只能保留一个
        // arguments.put("x-message-ttl", 100000); // 毫秒
        // 正常队列设置死信交换机
        arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);
        // 设置死信routingkey
        arguments.put("x-dead-letter-routing-key", "lisi");
        // 设置正常队列的长度的限制
        arguments.put("x-max-length", 6);
        // 死信队列
        channel.queueDeclare(NORMOL_QUEUE,false , false, false, arguments);
        // 绑定死信的交换机与私信的队列
        channel.queueBind(NORMOL_QUEUE, NORMOL_EXCHANGE , "zhangsan");

        ///////////////////////////////////////////////////////////////////////////////
        // 死信交换机
        channel.queueDeclare(DEAD_QUEUE,false , false, false, null);
        // 绑定普通的交换机与普通的队列
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE , "lisi");

        System.out.println("等待接受消息");


        DeliverCallback deliverCallback = (consumerTage, message) -> {
            String mssg = new String(message.getBody(),"utf-8");
            // 模拟消息被拒绝
            if ( mssg.equals("info5")) {
                System.out.println("info5被拒绝了："+mssg+"，此消息被拒绝了");
                channel.basicReject(message.getEnvelope().getDeliveryTag(), false); // 表示该消息被拒绝 false表示不放回队列，就进入到死信队列
            } else {
                System.out.println("Consumer01接收到的消息是："+mssg);
                channel.basicAck(message.getEnvelope().getDeliveryTag(),false );
            }

        };

        // 开启手动应答
        channel.basicConsume(NORMOL_QUEUE, false, deliverCallback,consumer->{

        });
    }
}
